# 线性回归 Linear Regression Demo
from numpy import *
import matplotlib.pylab as plt

# 数据预处理
def loadDataSet(fileName):
    dataMat = []
    labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = []
        curLine = line.strip().split('\t')
        for i in range(2):
            lineArr.append(float(curLine[i]))  # 前两行为x1，x2
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat, labelMat


# 按公式求超参
def standRegres(xArr, yArr):
    # 通过mat()方法拿到矩阵
    xMat = mat(xArr)
    yMat = mat(yArr).T

    # x的转置乘以x
    xTx = xMat.T * xMat
    # 矩阵存在逆的前提是：矩阵的行列式不为0
    # 我们判断一下它的逆
    if linalg.det(xTx) == 0:
        return
    ws = xTx.I * (xMat.T * yMat)  # xTx。I 为它的逆  .T为转置
    return ws

def regression1():
    xArr,yArr=loadDataSet("./data/data.txt")
    xMat=mat(xArr)
    yMat=mat(yArr)
    ws=standRegres(xArr,yArr)
    fig=plt.figure()
    ax=fig.add_subplot(111)     # add_subplot(349)函数的参数的意思是，将画布分成3行4列图像画在从左到右从上到下第9块
    ax.scatter(xMat[:, 1].flatten().tolist(), yMat.T[:, 0].flatten().A[0].tolist())  # scatter 的x是xMat中的第二列，y是yMat的第一列
    xCopy = xMat.copy()
    xCopy.sort(0)
    yHat = xCopy * ws
    ax.plot(xCopy[:, 1], yHat)
    plt.show()

if __name__ == "__main__":
    regression1()